package java_thinking.unit_18_IO;

import java.io.IOException;
import java.io.InputStream;

/**
 * @Desc:   FilterInputStream：装饰器模式的核心，是我们在装饰器模式中的Decorator对象，主要完成对其它流装饰的基本功能
 *                              该类对被装饰的流进行基本的包裹。不增加额外的功能
 *          InputStream：装饰器模式的顶层类
 * @author: cww
 * @DateTime: 2019-05-19 21:20
 */

public class FilterInputStream extends InputStream {

    /**
     * 将要被装饰的字节输入流
     */
    protected volatile InputStream in;

    /**
     * 装饰器的代码特征：被装饰的对象一般是装饰器的成员变量
     * @param in
     */
    protected FilterInputStream(InputStream in) {
        this.in = in;
    }

    /**
     * 下面这些方法，完成最小的装饰――0装饰，只是调用被装饰流的方法而已，没有添加任何额外功能
     * 即：装饰器模式中的Decorator对象，不增加被装饰对象的功能
     */

    @Override
    public int read() throws IOException {
        return in.read();
    }

    public FilterInputStream() {
        super();
    }

    @Override
    public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }

    @Override
    public int read(byte b[], int off, int len) throws IOException {
        return in.read(b, off, len);
    }

    @Override
    public long skip(long n) throws IOException {
        return in.skip(n);
    }

    @Override
    public int available() throws IOException {
        return in.available();
    }

    @Override
    public void close() throws IOException {
        in.close();
    }

    @Override
    public synchronized void mark(int readlimit) {
        in.mark(readlimit);
    }

    @Override
    public synchronized void reset() throws IOException {
        in.reset();
    }

    @Override
    public boolean markSupported() {
        return in.markSupported();
    }
}
